import { getPlatformType, isMpWeixin } from './platform'

/**
 * 多端请求工具
 * 适配不同平台的网络请求方式
 */
export const request = {
  /**
   * 基础请求方法
   * @param {string} url - 请求地址
   * @param {Object} options - 请求选项
   * @returns {Promise} 请求Promise
   */
  async request(url, options = {}) {
    const baseUrl = import.meta.env.VITE_BASE_URL
    const fullUrl = url.startsWith('http') ? url : `${baseUrl}${url}`
    const method = options.method || 'GET'
    const data = options.data || {}
    
    // 根据平台选择不同的请求方式
    const platform = getPlatformType()
    
    try {
      if (platform === 'mp-weixin' && typeof wx !== 'undefined') {
        // 微信小程序请求
        return new Promise((resolve, reject) => {
          wx.request({
            url: fullUrl,
            method,
            data,
            header: {
              'Content-Type': 'application/json',
              ...options.headers
            },
            success: (res) => {
              if (res.statusCode >= 200 && res.statusCode < 300) {
                resolve(res.data)
              } else {
                reject(new Error(`请求失败: ${res.statusCode}`))
              }
            },
            fail: (err) => {
              reject(err)
            }
          })
        })
      } else {
        // Web/H5/App使用fetch请求
        const fetchOptions = {
          method,
          headers: {
            'Content-Type': 'application/json',
            ...options.headers
          }
        }
        
        // GET请求参数处理
        if (method.toUpperCase() === 'GET' && Object.keys(data).length > 0) {
          const params = new URLSearchParams(data)
          fullUrl += `?${params.toString()}`
        } else if (method.toUpperCase() !== 'GET') {
          // 非GET请求数据处理
          fetchOptions.body = JSON.stringify(data)
        }
        
        const response = await fetch(fullUrl, fetchOptions)
        
        if (!response.ok) {
          throw new Error(`请求失败: ${response.status}`)
        }
        
        return await response.json()
      }
    } catch (error) {
      console.error('请求错误:', error)
      throw error
    }
  },
  
  /**
   * GET请求
   * @param {string} url - 请求地址
   * @param {Object} params - 请求参数
   * @param {Object} options - 请求选项
   * @returns {Promise} 请求Promise
   */
  get(url, params = {}, options = {}) {
    return this.request(url, { ...options, method: 'GET', data: params })
  },
  
  /**
   * POST请求
   * @param {string} url - 请求地址
   * @param {Object} data - 请求数据
   * @param {Object} options - 请求选项
   * @returns {Promise} 请求Promise
   */
  post(url, data = {}, options = {}) {
    return this.request(url, { ...options, method: 'POST', data })
  },
  
  /**
   * PUT请求
   * @param {string} url - 请求地址
   * @param {Object} data - 请求数据
   * @param {Object} options - 请求选项
   * @returns {Promise} 请求Promise
   */
  put(url, data = {}, options = {}) {
    return this.request(url, { ...options, method: 'PUT', data })
  },
  
  /**
   * DELETE请求
   * @param {string} url - 请求地址
   * @param {Object} params - 请求参数
   * @param {Object} options - 请求选项
   * @returns {Promise} 请求Promise
   */
  delete(url, params = {}, options = {}) {
    return this.request(url, { ...options, method: 'DELETE', data: params })
  }
}
